<?php

namespace Duante\GuLu;


/* 加密 */

class Crypto
{
    /**
     * 对数据通过RSA算法公钥加密
     * @param $str 需要加密的字符串
     * @param $public_key_path 公钥存储路径
     * @return string 返回base64格式加密结果
     */
    function encrypt($str, $public_key_path)
    {
        $public_key = file_get_contents($public_key_path);

        // 加密数据结果
        $encrypted = '';

        $public_key_id = openssl_get_publickey($public_key);
        $key_len = openssl_pkey_get_details($public_key_id)['bits'];

        // 长字符分段加密
        $part_len = $key_len / 8 - 11;
        $parts = str_split($str, $part_len);

        foreach ($parts as $part) {
            $encrypted_temp = '';
            openssl_public_encrypt($part, $encrypted_temp, $public_key);
            $encrypted .= $encrypted_temp;
        }

        return base64_encode($encrypted);
    }

    /**
     * RSA 解密数据
     * @param $str 需要解密的字符串
     * @param $private_key_path 私钥存储路径
     * @return string
     */
    function decrypt($str, $private_key_path)
    {
        $private_key = file_get_contents($private_key_path);

        $str = str_replace(' ', '+', $str);

        $decrypted = "";

        $private_key_id = openssl_get_privatekey($private_key);
        $key_len = openssl_pkey_get_details($private_key_id)['bits'];

        $part_len = $key_len / 8;
        $base64_decoded = base64_decode($str);
        $parts = str_split($base64_decoded, $part_len);

        foreach ($parts as $part) {
            $decrypted_temp = '';
            openssl_private_decrypt($part, $decrypted_temp, $private_key);
            $decrypted .= $decrypted_temp;
        }

        return $decrypted;
    }

    /**
     * 密码加密
     * @param $value 原始密码
     * @return bool|string
     */
    function hash_make($value)
    {
        $hash = password_hash($value, PASSWORD_BCRYPT);

        if ($hash === false) {
            return false;
        }

        return $hash;
    }

    /**
     * 密码验证
     * @param string $value 原始密码
     * @param $hash hash密码串
     * @return bool
     */
    function hash_check($value, $hash)
    {
        if (strlen($hash) === 0) {
            return false;
        }

        return password_verify($value, $hash);
    }

    /**
     * 获取加密信息
     * @param $hash
     * @return array
     */
    function hash_info($hash)
    {
        return password_get_info($hash);
    }

    /**
     * @param $hash
     * @return bool
     */
    function hash_needs_rehash($hash)
    {
        return password_needs_rehash($hash, PASSWORD_BCRYPT);
    }

}